﻿using System;
using System.Collections.Generic;
using System.Text;
using log4net;
using NHibernate;
using Entidades;

namespace AccesoDatos.DAO
{
    public class DaoUsuario:IDAO.IDaoUsuario
    {
        protected static readonly ILog log = LogManager.GetLogger(typeof(DaoHistorialEvento));
        public IList<Usuario> SeleccionarPorUsuarioYContrasena(string usuario, string contrasena)
        {
            try
            {
                log4net.Config.XmlConfigurator.Configure();
                log.Info("Entra en el metodo SeleccionarPorUsuarioYContrasena recibiendo: parametro: " + usuario +
                         " valor:" + contrasena);
                ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
                sesion.BeginTransaction();
                IQuery query =
                    sesion.CreateQuery("from Usuario where Nombreusuario ='" + usuario + "'" + "AND Contrasena ='" +
                                       contrasena + "'");
                IList<Usuario> usuariofinal = query.List<Usuario>();
                sesion.Transaction.Commit();
                log4net.Config.XmlConfigurator.Configure();
                log.Info("Usuario por parametro nombre usuario y contraseña retornado con exito");
                return usuariofinal;
            }
            catch (ADOException exception)
            {
                log.Error("Error al seleccionar por usuario y contrasena");
                log.Error(exception.Message);
            }
            return null;
        }

        /// <summary>
        /// Retorna una lista de usuario que tenga
        /// como parametro nombre del usuario 
        /// </summary>
        
        public IList<Usuario> BuscarPorNombreUsuario(string nombre)
        {
            try
            {
                log4net.Config.XmlConfigurator.Configure();
                log.Info("Entra en el metodo BuscarPorNombreUsuario recibiendo: parametro: " + nombre + "'");
                ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
                sesion.BeginTransaction();
                IQuery query = sesion.CreateQuery("from Usuario where nombreusuario = '" + nombre + "'");
                IList<Usuario> retorna = query.List<Usuario>();
                sesion.Transaction.Commit();
                log4net.Config.XmlConfigurator.Configure();
                log.Info("Lista de usuario retornada con exito");
                return retorna;
            }catch(ADOException exception)
            {
                log.Error("Error al buscar por nombre de usuario");
                log.Error(exception.Message);
                return null;
            }
        
        }

        public void EliminarPorId(int id)
        {
            throw new NotImplementedException();
        }

        /// <summary>
        /// Retorna una lista de todos los usuarios que se encuentran 
        /// registrados en el sistema
        /// </summary>
        
        public IList<Usuario> SeleccionarTodos()
        {
            try
            {
                log4net.Config.XmlConfigurator.Configure();
                log.Info("Entra en el metodo SeleccionarTodos de usuario");
                ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
                sesion.BeginTransaction();
                IQuery query = sesion.CreateQuery("from Usuario");
                IList<Usuario> retorna = query.List<Usuario>();
                sesion.Transaction.Commit();
                log4net.Config.XmlConfigurator.Configure();
                log.Info("Lista de usuario retornada con exito");
                return retorna;
            }catch(ADOException exception)
            {
                log.Error("Error al seleccionar los usuarios");
                log.Error(exception.Message);
            }
            return null;
        }

        public Usuario SeleccionarPorId(int id)
        {
            throw new NotImplementedException();
        }

     

        /// <summary>
        /// Metodo que recibe un objeto tomado
        /// del formulario y lo inserta en la 
        /// bd 
        /// </summary>
        public void Insertar(Usuario c)
        {
            ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
            ITransaction transaccion = null;
            try
            {
                transaccion = sesion.BeginTransaction();
                sesion.Save(c);
                transaccion.Commit();
                sesion.Flush();
                log4net.Config.XmlConfigurator.Configure();
                log.Warn("Lista de usuario retornada con exito");
            }
            catch (Exception e)
            {
                e.GetBaseException();
                if (transaccion != null)
                {
                    transaccion.Rollback();
                    throw;
                }
            }
        }

        public void Modificar(Entidades.Usuario c)
        {
            ConfiguracionNHibernate.CloseSession();
            ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
            sesion.BeginTransaction();
            sesion.Update(c);
            sesion.Transaction.Commit();
            log4net.Config.XmlConfigurator.Configure();

            log.Warn("Objeto Usuario modificado con exito");
        }

        void ICrud<Usuario, int>.EliminarPorId(int id)
        {
            EliminarPorId(id);
        }

        /// <summary>
        /// Recibe el id del evento que se desea eliminar
        /// y lo elimina de la bd
        /// </summary>
        
        public void EliminarPorId(string nombreUsuario)
        {

            throw new NotImplementedException();
        }

    }
}
